#include "StdAfx.hpp"

#include "Y.hpp"

#include <stdio.h>

void Y::Echo(int i) {
    printf("void Y::Echo(int): i = %d\n", i);
}

void Y::Echo() {
    printf("void Y::Echo(), no args\n");
}

void Y::DoEcho() {
    Echo(1234567);
}

double Y::DoPV(double d) {
    printf("double Y::DoPV(double d): d = %g\n", d);
    double ret = PV(d);

    printf("double Y::DoPV(double d): Got from subclass: %g\n", ret);
    return ret;
}

int *Y::GetIntPtr() const {
    static int i = 1234567;
    printf("int * Y::GetIntPtr() -- [0x%p]\n", &i);
    return &i;
}

void Y::SetIntPtr(int *p) {
    printf("Y::SetIntPtr(int *p): p: %d[0x%p]\n", *p, p);
}

const double &Y::GetDoubleRef() const {
    static double d = 3.14;
    printf("const double &Y::GetDoubleRef() -- [0x%p]\n", &d);
    return d;
}

void Y::SetDoubleRef(double &d) {
    printf("Y::SetDoubleRef(double &d): d: %g\n", d);
}

Y *Y::GetY1() const {
    return const_cast<Y *>(this);
}

const Y *Y::GetY2() const {
    return this;
}

const Y **Y::GetY3() const {
    static const Y *p = this;
    return &p;
}

const Y &Y::GetY4() const {
    return *this;
}

Y &Y::GetY5() {
    return *this;
}

Y *&Y::GetY6() {
    static Y *p = this;
    return p;
}

Y *Y::SetY1(Y *const y) const {
    printf("Y *Y::SetY1(Y *const y) const == %d\n", y == this);
    return const_cast<Y *>(this);
}

Y *Y::SetY2(const Y &y) const {
    printf("Y *Y::SetY2(const Y &y) const == %d\n", &y == this);
    return const_cast<Y *>(this);
}

int PrintY(Y *y) {
    printf("int ::PrintY(Y *y) ==> %g\n", y->GetDouble());
    return -1;
}
